/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package datenbank;

import java.sql.*;
import java.util.*;
import data.*;
import java.util.Date;
import java.rmi.RemoteException;
import java.text.*;

/**
 *
 * @author Daniel
 */
public class BestellungMapper {

    private static BestellungMapper bestellungMapper = null;

    /**
     * statische Methode, die sicherstellt, dass nur eine Istanz von bestellungMapper erzeugt wird.
     *
     * @return Das bestellungMapper -Objekt.
     */
    public static BestellungMapper bestellungMapper() {
        if (bestellungMapper == null) {
            bestellungMapper = new BestellungMapper();
        }

        return bestellungMapper;
    }

    /**
    * Hier wird ein neues Bestellung (-Objekt) in die Datenbank eingefügt.
    * Dabei wird auch überprüft was die bisher höchste bestell_id(der Primärschlüssel) ist.
    *
    * @param be ist das das zu speichernde Tisch-Objekt
    * @return das bereits übergebene Objekt, jedoch mit ggf. korrigierter bestell_id vom Typ Bestellung
    */
    public Bestellung insert(Bestellung be, Tisch ti) {

        // Stellt durch Aufruf der connection() Methode der DBConnection-Klasse, die Verbindung zur Datenbank her. */
        Connection con = DBConnection.connection();

        try {
            Statement stmt = con.createStatement();

            /*
             * Hier wird überprüft welche produkt_id bisher die höhste ist.
             */
            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(bestell_id) AS maxid " +
                    "FROM Bestellung ");


            if (rs.next()) {
                try {
                    /* Hier wird die bisher höhste vorhandene produkt_id um +1 erhöht.
                     */
                    be.set_bestell_id(rs.getInt("maxid") + 1);

                    stmt = con.createStatement();

                    //Statement wird ausgefüllt und als Query an die DB geschickt.
                    stmt.executeUpdate("INSERT INTO Bestellung(bestell_id,tisch_id)" +
                            "VALUES (" +
                            be.get_bestell_id() + "," +     // Bestell ID wird in die DB geschrieben
                            //aktuelles_datum + "'," +         // Aktuelles Datum wird in die DB geschrieben
                            ti.get_tisch_id() + ")");       // Tisch ID wird in die DB geschrieben

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        /* Rückgabe des angelegten Objekts be von Typ Produkt.
         */
        return be;
    }

    public Bestellung update(Bestellung be, Tisch ti) {
        /* Stellt durch Aufruf der connection() Methode der DBConnection-Klasse, die Verbindung zur Datenbank her. */
        Connection con = DBConnection.connection();

        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            //Statement wird ausgefüllt und als Query an die DB geschickt.
            stmt.executeUpdate("UPDATE Bestellung " +
                    "SET tisch_id=" + ti.get_tisch_id() + " " +
                    "WHERE bestell_id=" + be.get_bestell_id());

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // das als Parameter übergebende Objekt des Typs Bestellung wird zurückgegeben
        return be;
    }

    /**
     * Diese Methode löscht alle Daten eines Bestellung- Objekts aus der Datenbank.
     *
     * @param ti ist das zu löschende Objekt
     */
    public void delete(Bestellung be) {
        Connection con = DBConnection.connection();

        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            // Statement wird ausgefüllt und als Query an die DB geschickt.
            stmt.executeUpdate("DELETE FROM Bestellung " +
                    "WHERE bestell_id=" + be.get_bestell_id());

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    /**
     * Bei dieser Methode werden alle Bestellungen ausgelesen.
     *
     * @return Es wird ein Vektor mit Bestellungs-Objekten, d.h. allen in der Datenbank angelegte Bestellungen, zurückgegeben.
     * Bei evtl. Exceptions wird ein partiell gefüllter oder ggf.
     * auch leerer Vektor vom Typ Bestellung zurückgeliefert.
     */
    public Vector<Bestellung> findAll() {
        Connection con = DBConnection.connection();
        Vector<Bestellung> result = new Vector<Bestellung>();

        try {
            Statement stmt = con.createStatement();


            ResultSet rs = stmt.executeQuery(
                    "SELECT bestell_id, tisch_id, datum " +
                    "FROM Bestellung " +
                    "ORDER BY bestell_id");

            // Für jeden Eintrag im Suchergebnis wird nun ein Bestell-Objekt be erstellt.
            while (rs.next()) {
                try {
                    BestellungImpl be = new BestellungImpl();
                    be.set_bestell_id(rs.getInt("bestell_id"));
                    be.set_tisch_id(rs.getInt("tisch_id"));
                    be.set_date(rs.getTimestamp("datum"));
                    //Hier wird das Objekt dem Ergebnisvektor hinzugefügt
                    result.addElement(be);
                } catch (Exception e) {
                    e.printStackTrace();
                    //Bei einer evtl. Exception wird die while-Schleife abgebrochen.
                    break;
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        // Ergebnisvektor vom Typ Bestellung wird zurückgeben.
        return result;
    }

    /**
     * Diese Methode sucht die Datenbank nach einer Bestellung mit eingegebener ID.
     *
     * @param bestell_id ist das Primärschlüsselattribut Bestellung in der Datenbank.
     * @return Das Objekt vom Typ Bestellung, das der id entspricht wird zurückgegebn.
     * null wird zurückgegeben, wenn das Objekt nicht in der Datenbank vorhanden ist.
     * Da es sich um einen Primärschlüssel handelt und dieser somit eindeutig ist, wird genau ein Objekt zurückgegeben.
     */
    public Bestellung findbyid(int id) {
        Connection con = DBConnection.connection();

        try {
            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT bestell_id, tisch_id, datum FROM Bestellung " +
                    "WHERE bestell_id =" + id +
                    " ORDER BY bestell_id");

            /*
             * Da es sich bei id um einen Primärschlüssel handelt, kann max. nur ein Tupel zurückgegeben werden.
             * Es wird geprüft, ob ein Ergebnis vorliegt. Wenn ja werden die Attribute bestell_id,
             * tisch_id, date und bezahlt ausgelesen und als Typ Bestellung zurückgegeben.
             */
            if (rs.next()) {
                try {

                    BestellungImpl be = new BestellungImpl();
                    be.set_bestell_id(rs.getInt("bestell_id"));
                    be.set_tisch_id(rs.getInt("tisch_id"));
                    be.set_date(rs.getTimestamp("datum"));
                    return be;

                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
            return null;
        }

        return null;
    }

    /**
     * Diese Methode überprüft ob ein Tisch-Objekt ti existiert, d.h. ob es irgenwo in der Tabelle in der Datenbank Bestellung steht
     * @param tisch_id ist das Primärschlüsselattribut, nachdem in der Tabelle gesucht werden soll.
     * @return Wenn der Tisch in einer Bestellung existiert wird der Wert true vom Typ boolean zurückgegeben.
     * wenn der Tisch nicht existiert wird der Wert false vom Typ boolean zurückgegeben.
     *
     */
    public boolean existsTisch(Tisch ti) throws RemoteException {
        /** Stellt durch Aufruf der connection() Methode der DBConnection-Klasse, die Verbindung zur Datenbank her. */
        Connection con = DBConnection.connection();
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {

            stmt = con.prepareStatement(
                    "SELECT * FROM Bestellung WHERE tisch_id =" + ti.get_tisch_id());
            rs = stmt.executeQuery();
            if (rs.next() == true) {
                return true;
            } else {
                return false;
            }

        } catch (SQLException e) {
            e.printStackTrace();
            return false;
        }

    }

    /**
     * Bei dieser Methode werden alle Bestellungen ausgelesen.
     *
     * @return Es wird ein Vektor mit Bestellungs-Objekten, d.h. allen in der Datenbank angelegte Bestellungen, zurückgegeben.
     * Bei evtl. Exceptions wird ein partiell gefüllter oder ggf.
     * auch leerer Vektor vom Typ Bestellung zurückgeliefert.
     */
//    public int getPR_byTime(Timestamp start, Timestamp end, Produkt pr) {
//        Connection con = DBConnection.connection();
//        Vector<Bestellung> result = new Vector<Bestellung>();
//
//        try {
//            Statement stmt = con.createStatement();
//
//            // Umwandlung des Timestamps start in das Format was die Datenbank benötigt um die Abfrage durchzuführen
//            String startstring = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss").format(start);
//
//            // Umwandlung des Timestamps end in das Format was die Datenbank benötigt um die Abfrage durchzuführen
//            String endstring = new SimpleDateFormat("yyyy.MM.dd hh:mm:ss").format(end);
//
//            ResultSet rs = stmt.executeQuery(
//                    "SELECT bestell_id,tisch_id,datum " +
//                    "FROM Bestellung " +
//                    "WHERE datum BETWEEN '" +
//                    startstring + "' AND '" + endstring + "'");
//
//
//            // Für jeden Eintrag im Suchergebnis wird nun ein Bestell-Objekt be erstellt.
//            while (rs.next()) {
//                try {
//                    BestellungImpl be = new BestellungImpl();
//                    be.set_bestell_id(rs.getInt("bestell_id"));
//                    be.set_tisch_id(rs.getInt("tisch_id"));
//                    be.set_date(rs.getTimestamp("datum"));
//                    //Hier wird das Objekt dem Ergebnisvektor hinzugefügt
//                    result.addElement(be);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    //Bei einer evtl. Exception wird die while-Schleife abgebrochen.
//                    break;
//                }
//            }
//        } catch (SQLException e2) {
//            e2.printStackTrace();
//        }
//        // Ergebnisvektor vom Typ Bestellung wird zurückgeben.
//        return result;
//    }
}
